/**
 * 短信验证码监听器
 * 功能：监听短信验证码并自动提取
 * 作者：AutoJS用户
 * 版本：1.0
 */

// 请求必要权限
function requestPermissions() {
    console.log("正在请求短信权限...");
    
    // 请求短信读取权限和网络权限
    if (!runtime.requestPermissions(["android.permission.READ_SMS", "android.permission.RECEIVE_SMS", "android.permission.INTERNET"])) {
        toast("需要短信权限才能监听验证码");
        exit();
    }
    
    console.log("权限申请成功");
}

/**
 * 从短信内容中提取验证码
 * @param {string} content - 短信内容
 * @returns {string|null} - 提取到的验证码或null
 */
function extractVerificationCode(content) {
    // 常见验证码格式的正则表达式
    const patterns = [
        /验证码[：:]?\s*(\d{4,8})/,  // 验证码：1234
        /验证码为[：:]?\s*(\d{4,8})/,  // 验证码为1234
        /code[：:]?\s*(\d{4,8})/i,   // code: 1234
        /\b(\d{4,8})\b.*验证码/,      // 1234验证码
        /\b(\d{6})\b/,              // 6位数字
        /\b(\d{4})\b/               // 4位数字
    ];
    
    for (let pattern of patterns) {
        const match = content.match(pattern);
        if (match) {
            return match[1];
        }
    }
    
    return null;
}

/**
 * 读取最新的短信
 * @returns {Array} - 短信列表
 */
function getLatestSMS() {
    try {
        const uri = "content://sms/inbox";
        const cursor = context.getContentResolver().query(
            android.net.Uri.parse(uri),
            ["address", "body", "date"],
            null,
            null,
            "date DESC"
        );
        
        const messages = [];
        if (cursor && cursor.moveToFirst()) {
            do {
                const address = cursor.getString(0);
                const body = cursor.getString(1);
                const date = cursor.getLong(2);
                
                messages.push({
                    address: address,
                    body: body,
                    date: new Date(date)
                });
            } while (cursor.moveToNext() && messages.length < 10); // 只读取最新10条
        }
        
        if (cursor) {
            cursor.close();
        }
        
        return messages;
    } catch (error) {
        console.error("读取短信失败:", error);
        return [];
    }
}

/**
 * 监听新短信（轮询方式）
 * @param {function} callback - 回调函数
 * @param {number} interval - 检查间隔（毫秒）
 */
function startSMSListener(callback, interval = 2000) {
    let lastMessageTime = 0;
    
    console.log("开始监听短信验证码...");
    toast("短信监听已启动");
    
    const timer = setInterval(() => {
        const messages = getLatestSMS();
        
        if (messages.length > 0) {
            const latestMessage = messages[0];
            
            // 检查是否是新消息（5分钟内的消息）
            const messageTime = latestMessage.date.getTime();
            const now = Date.now();
            
            if (messageTime > lastMessageTime && (now - messageTime) < 5 * 60 * 1000) {
                lastMessageTime = messageTime;
                
                console.log("收到新短信:", latestMessage.body);
                
                // 提取验证码
                const code = extractVerificationCode(latestMessage.body);
                
                if (code) {
                    console.log("提取到验证码:", code);
                    callback({
                        code: code,
                        sender: latestMessage.address,
                        content: latestMessage.body,
                        time: latestMessage.date
                    });
                }
            }
        }
    }, interval);
    
    return timer;
}

/**
 * 停止监听
 * @param {number} timer - 定时器ID
 */
function stopSMSListener(timer) {
    if (timer) {
        clearInterval(timer);
        console.log("短信监听已停止");
        toast("短信监听已停止");
    }
}

/**
 * 发送验证码到服务端
 * @param {string} code - 验证码
 * @param {string} sender - 发送方号码
 * @param {string} content - 完整短信内容
 * @param {Date} time - 短信时间
 */
function sendCodeToServer(code, sender, content, time) {
    try {
        let data = {
            code: code,
            sender: sender || "unknown",
            content: content,
            timestamp: time ? time.toISOString() : new Date().toISOString(),
            device: device.getAndroidId()
        };
        
        console.log("正在发送验证码到服务端...");
        
        let response = http.postJson("http://192.168.1.54:8000/sms", data);
        
        if (response.statusCode == 200) {
            console.log("验证码发送成功:", response.body.string());
            toast("验证码已发送到服务端");
            return true;
        } else {
            console.log("发送失败，状态码:", response.statusCode);
            toast("发送失败: " + response.statusCode);
            return false;
        }
    } catch (error) {
        console.error("发送验证码失败:", error);
        toast("网络错误，发送失败");
        return false;
    }
}

/**
 * 自动填充验证码到输入框
 * @param {string} code - 验证码
 * @param {string} selector - 输入框选择器（可选）
 */
function autoFillCode(code, selector) {
    try {
        let input;
        
        if (selector) {
            input = selector(selector).findOne(3000);
        } else {
            // 尝试常见的验证码输入框
            input = className("EditText").findOne(3000) ||
                   id("code").findOne(1000) ||
                   id("verifyCode").findOne(1000) ||
                   id("verification_code").findOne(1000) ||
                   text("请输入验证码").findOne(1000);
        }
        
        if (input) {
            input.setText(code);
            console.log("验证码已自动填充:", code);
            toast("验证码已自动填充: " + code);
            return true;
        } else {
            console.log("未找到验证码输入框");
            // 复制到剪贴板作为备选方案
            setClip(code);
            toast("验证码已复制到剪贴板: " + code);
            return false;
        }
    } catch (error) {
        console.error("自动填充失败:", error);
        setClip(code);
        toast("验证码已复制到剪贴板: " + code);
        return false;
    }
}

// 主程序
function main() {
    console.log("=== 短信验证码监听器启动 ===");
    
    // 请求权限
    requestPermissions();
    
    // 启动监听
    const timer = startSMSListener((smsData) => {
        console.log("\n=== 收到验证码 ===");
        console.log("发送方:", smsData.sender);
        console.log("验证码:", smsData.code);
        console.log("时间:", smsData.time.toLocaleString());
        console.log("完整内容:", smsData.content);
        
        // 显示通知
        toast("收到验证码: " + smsData.code);
        
        // 发送到服务端
        sendCodeToServer(smsData.code, smsData.sender, smsData.content, smsData.time);
        
        // 尝试自动填充
        autoFillCode(smsData.code);
        
        // 可以在这里添加其他处理逻辑
        // 比如发送到其他应用、保存到文件等
    });
    
    // 监听音量键停止
    console.log("\n按音量下键停止监听");
    events.observeKey();
    events.onKeyDown("volume_down", () => {
        stopSMSListener(timer);
        exit();
    });
    
    // 保持脚本运行
    setInterval(() => {}, 1000);
}

// 导出函数供其他脚本使用
module.exports = {
    requestPermissions,
    extractVerificationCode,
    getLatestSMS,
    startSMSListener,
    stopSMSListener,
    sendCodeToServer,
    autoFillCode
};

// 如果直接运行此脚本
if (typeof module === 'undefined' || !module.parent) {
    main();
}